﻿using System;
using System.Data.Objects.DataClasses;
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using Unijovem.Domain;
using Unijovem.UI.Helpers;
using Unijovem.UI.Models;

namespace Unijovem.UI.Controllers
{
    public class AccountController : ControllerBase
    {

        public IFormsAuthenticationService FormsService { get; set; }
        public IMembershipService MembershipService { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
            if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

            base.Initialize(requestContext);
        }

        // **************************************
        // URL: /Account/LogOn
        // **************************************

        public ActionResult LogOn(string returnUrl)
        {
            return View(new LogOnModel { ReturnUrl = returnUrl });
        }

        [HttpPost]
        public ActionResult LogOn(LogOnModel model)
        {
            ClearAllSessions();

            var usuarioLogin = new Usuario
            {
                Senha = model.Password,
                Pessoas = new EntityCollection<Pessoa> { new Pessoa { Email = model.UserName } }
            };

            var pessoa = usuarioLogin.Autenticar();

            if (pessoa == null || pessoa.Usuario == null)
                ModelState.AddModelError("", "Email não cadastrado.");
            else
            {
                if (pessoa.Usuario.SenhaInvalida)
                {
                    ModelState.AddModelError("", "Senha inválida.");
                    return View(model);
                }

                if (pessoa.Usuario.LoginAtivo == false)
                {
                    ModelState.AddModelError("", "Este usuário ainda não foi ativado, para ativá-lo clique no link recebido em seu email no cadastramento "
                        + "ou clique aqui para receber novamente o email");
                    return View(model);
                }

                PessoaLogada = pessoa;
                FormsAuthentication.SetAuthCookie(pessoa.NomeCompleto.Split(' ').First(), false);

                //if (MensagemController.PessoasOnline == null) MensagemController.SelecionarUsuariosOnline(pessoa.Id);

                //var pessoaOnline = MensagemController.PessoasOnline.FirstOrDefault(m => m.Id == pessoa.Id);
                //if (pessoaOnline != null)
                //{
                //    var index = MensagemController.PessoasOnline.IndexOf(pessoaOnline);
                //    MensagemController.PessoasOnline[index] = pessoa;
                //}

                return Url.IsLocalUrl(model.ReturnUrl) && model.ReturnUrl.Length > 1 && model.ReturnUrl.StartsWith("/")
                           && !model.ReturnUrl.StartsWith("//") && !model.ReturnUrl.StartsWith("/\\")
                               ? (ActionResult)Redirect(model.ReturnUrl)
                               : RedirectToAction("Index", "Home");
            }

            return View(model);
        }

        // **************************************
        // URL: /Account/LogOff
        // **************************************

        public ActionResult LogOff()
        {
            //if(Request.IsAuthenticated)
            //{
            //    PessoaLogada.Usuario.StatusChat = ((int) UsuarioModel.StatusEnum.Offline).ToString();
            //    PessoaLogada.Usuario.Save(PessoaLogada.Usuario);
            //}
            
            ClearAllSessions();

            if (FormsService == null) FormsService = new FormsAuthenticationService();

            FormsService.SignOut();

            return RedirectToAction("Index", "Home");
        }

        // **************************************
        // URL: /Account/Register
        // **************************************

        public ActionResult Register()
        {
            ViewBag.PasswordLength = MembershipService.MinPasswordLength;
            return View();
        }

        [HttpPost]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);

                if (createStatus == MembershipCreateStatus.Success)
                {
                    FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            ViewBag.PasswordLength = MembershipService.MinPasswordLength;
            return View(model);
        }

        // **************************************
        // URL: /Account/ChangePassword
        // **************************************

        public ActionResult ChangePassword(string codigo)
        {
            if (string.IsNullOrEmpty(codigo))
                return View();

            var email = Domain.Helpers.Util.Descriptografar(codigo.Replace(" ", "+"));
            return View(new ChangePasswordModel { Email = email });
        }

        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {
                var usuarioLogin = new Usuario
                {
                    Senha = model.OldPassword,
                    Pessoas = new EntityCollection<Pessoa> { new Pessoa { Email = model.Email } }
                };

                var pessoa = usuarioLogin.Autenticar();

                if (pessoa == null)
                {
                    ModelState.AddModelError("Email", "Email inválido ou não cadastrado.");
                    return View(model);
                }

                if (pessoa.Usuario.SenhaInvalida)
                {
                    ModelState.AddModelError("OldPassword", "Senha inválida.");
                    return View(model);
                }

                pessoa.Usuario.Senha = Domain.Helpers.Util.Criptografar(model.NewPassword);
                pessoa.Usuario.LoginAtivo = true;
                pessoa.Usuario.Save(pessoa.Usuario);

                return RedirectToAction("ChangePasswordSuccess");
            }

            return View(model);
        }

        // **************************************
        // URL: /Account/ChangePasswordSuccess
        // **************************************

        public ActionResult ChangePasswordSuccess()
        {
            return View();
        }

        public ActionResult ForgetPassword()
        {
            return View();
        }

        [HttpPost]
        public ActionResult ForgetPassword(string email)
        {
            var pessoa = new PessoaModel().CriarViewModel(new Pessoa().SelecionarPessoaPorEmail(email));

            if (pessoa == null)
                return Json(new { success = false, erro = "Email não cadastrado no site, verifique se o email foi digitado corretamente." });

            var emailEnvio = new MailHelper.Email
            {
                From = ContaEmailHelper.ObterConta(ContaEmailHelper.Conta.NaoResponder),
                Subject = "Unijovem IBVG - Esqueci minha senha",
                TemplatePath = string.Concat(Url.Action("EmailEsqueciSenha", "Pessoa", 0, "http"), "/", pessoa.Id),
                To = pessoa
            };

            try
            {
                MailHelper.SendTemplatedEmail(emailEnvio);
            }
            catch
            {
                return Json(new { success = false, erro = "Erro no envio do email. Tente novamente mais tarde." });
            }

            return Json(new { success = true });
        }
    }
}
